// Loesung_von_Aufgabe_8.4_2_Ballspiel

float db = 30.0; // Balldurchmesser
float xb = 50.0; // x-Starposition des Balls
float yb = 50.0; // y-Startposition des Balls
float vbx = 8.0; // Startgeschwindigkeit des Balls in x-Richtung
float vby = 4.0; // Startgeschwindigkeit des Balls in x-Richtung
float s = 100.0; // Größe des Schlägers
float p = 0; // Zahl der Treffer (Punkte)

void setup()
{
  size(600, 400);
}

void draw()
{
  background(#F2EDDC);

  // Wände
  stroke(#089828);
  strokeWeight(15);
  line(0, 0, 600, 0);
  line(0, 400, 600, 400);
  line(0, 0, 0, 400);

  // Schläger
  noStroke();
  strokeWeight(2);
  fill(#FC0A3B);
  rect(width, mouseY-s/2, -10, s);

  // Ball
  xb = xb + vbx;
  yb = yb + vby;
  stroke(#F04318);
  fill(#CFF018);
  ellipse(xb, yb, db, db);

  // Bedingungen für die Reflexion an den senkrechten Wänden
  if (yb <= db/2 || yb >= height-db/2) 
  {
    vby = -vby;
  }

  // Bedingungen für die Reflexion an den waagerechten Wänden
  if (xb < db/2 )
  {
    vbx = -vbx;
  }
  /* Bedingungen für den Punktgewinn beim Auftreffen auf den Schläger
   und Erhöhung der Ballgeschwindigkeit in x-Richtung */
  if ((abs(mouseY-yb) < 50) && xb >= width)
  {
    p++;
    vbx = -vbx*1.2;
  }

  // Ein neuer Ball wird beim Verlassen des Spielfeldes erzeugt
  if (xb > width+20)
  {
    vbx = 8.0;
    xb = random(50, 100);
    yb = random(50, 350);
  }

  // Text
  fill(#112AF7);
  textSize(30);
  text("Punkte " +round(p), 50, 100);
  fill(0);
  text("Zeit " +(30-millis()/1000), 50, 50);

  // Zeitliche Begrenzung für das Spiel
  if (millis()/1000 >= 30 )
  {
    fill(255, 0, 0);
    text("Spielende!", 50, 150);
    noLoop();
  }
}